package novel.core.common.respond;

import lombok.Getter;
import novel.core.common.constant.ErrorCodeEnum;

import java.util.Objects;

/**
 * Http Rest 响应工具及数据格式封装
 */
//为什么同时使用有参构造函数与无参构造函数?
//响应码与响应数据是分开的,之后会怎么处理这个问题?

@Getter
public class RestRespond<T> {

    /**
     * 响应码
     */
    private String code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 构造函数,赋值响应状态,默认为成功;
     */
    private RestRespond(){
        this.code = ErrorCodeEnum.OK.getCode();
        this.message = ErrorCodeEnum.OK.getMessage();
    }
    /**
     * 有参构造函数,状态码赋值
     */
    private RestRespond(ErrorCodeEnum codeEnum) {
        this.code = codeEnum.getCode();
        this.message = codeEnum.getMessage();
    }

    /**
     * 有参构造函数,数据赋值,且赋值成功状态码
     */
    private RestRespond(T data) {
        //调用无参构造函数，确保 code 和 message 字段被正确初始化
        this();
        this.data = data;
    }

    /**
     * 业务处理成功,无数据返回
     */
    public static RestRespond<Void> ok() {
        return new RestRespond<>();
    }

    /**
     * 业务处理成功,有数据返回
     */
    public static <T>RestRespond<T> ok(T data) {
        return new RestRespond<>(data);
    }
    /**
     * 业务处理失败,返回错误
     */
    public static RestRespond<Void> fail(ErrorCodeEnum errorCode) {
        return new RestRespond(errorCode);
    }

    public static RestRespond<Void> error() {
        return new RestRespond<>(ErrorCodeEnum.SYSTEM_ERROR);
    }

    /**
     * 判断是否成功,返回成功状态码;
     * @return
     */
    public boolean isOk() {
        //比较两类相等,为什么不用字符串对比
        // Objects.equals 提供了一个简洁且安全的方式来比较两个对象是否相等，无需额外的空检查逻辑。
        return Objects.equals(this.code, ErrorCodeEnum.OK.getCode());
    }



}

